package com.example.demo.utils;

import io.jsonwebtoken.Jwts;
import org.springframework.stereotype.Component;

import java.util.Date;

import static com.example.demo.utils.Constants.*;

@Component
public class JwtUtil {



    public String generateToken(String username) {
    // 使用JJWT库生成JWT令牌
        return Jwts.builder()
                // 设置JWT的主题为用户名
                .subject(username)
                // 设置JWT的签发时间为当前时间
                .issuedAt(new Date())
                // 设置JWT的过期时间为当前时间加上EXPIRATION_TIME
                .expiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                // 使用指定的密钥和签名算法（HS256）对JWT进行签名
                .signWith(JWT_SECURITY_KEY, Jwts.SIG.HS256)
                // 生成并返回最终的JWT字符串
                .compact();
    }

    public String extractUsername(String token) {
    // 使用JWT库解析token
        return Jwts.parser()
            // 设置用于验证token的密钥
                .verifyWith(JWT_SECURITY_KEY)
            // 构建JWT解析器
                .build()
            // 解析token，获取签名后的声明
                .parseSignedClaims(token)
            // 获取token的负载部分
                .getPayload()
            // 从负载中获取subject字段，即用户名
                .getSubject();
    }

    public String Renewal(String token){
        Date expiration = null;
        try {
            expiration = Jwts.parser()
                    .verifyWith(JWT_SECURITY_KEY)
                    .build()
                    .parseSignedClaims(token)
                    .getPayload()
                    .getExpiration();
        } catch (Exception e) {
            System.out.println("token已经过期");
            return "token过期";
        }
        try {
            assert expiration != null;
            long expirationTime = expiration.getTime();
            long l = expirationTime - System.currentTimeMillis();
            if (l < JWT_RENEWAL_TIME){
                return generateToken(extractUsername(token));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return "token过期";
    }

    public long extractExpireTime(String token){
        Date expiration = null;
        try {
            expiration = Jwts.parser()
                    .verifyWith(JWT_SECURITY_KEY)
                    .build()
                    .parseSignedClaims(token)
                    .getPayload()
                    .getExpiration();
        } catch (Exception e) {
            throw new RuntimeException("token过期");
        }
        assert expiration != null;
        long expirationTime = 0;
        try {
            expirationTime = expiration.getTime();
        } catch (Exception e) {
            throw new RuntimeException("token过期");
        }
        return expirationTime - System.currentTimeMillis();
    }
}
